package l1j.server.server.serverpackets;

import l1j.server.server.model.Instance.L1ItemInstance;

// Referenced classes of package l1j.server.server.serverpackets:
// ServerBasePacket

public class S_AddItem extends ServerBasePacket {

	private static String S_ADD_ITEM = "[S] S_AddItem";

	/**
	 * インベントリにアイテムを一つ追加する。
	 */
	public S_AddItem(final L1ItemInstance item) {
        writeC(S_OPCODE_ADDITEM);
        writeD(item.getId());
        writeH(0);
        writeC(item.getItem().getUseType());
        writeC(0);
        writeH(item.get_gfxid());
        writeC(item.getBless());
        writeD((int) item.getCount());
        writeC((item.isIdentified()) ? 1 : 0);
        writeS(item.getViewName());

        if (!item.isIdentified()) {
                writeC(0);
        } else {
                byte[] status = item.getStatusBytes();
                writeC(status.length);
                for (byte b : status) {
                        writeC(b);
                }
        }
        writeC(10);
        writeC(0);
        writeC(0);
        writeC(0);
        writeC(0);
        writeC(0);
        writeC(0);
        writeC(0);
        writeC(0);
        writeC(0);
        writeC(0);
//		this.writeC(S_OPCODE_ADDITEM);
//		this.writeD(item.getId());
//		switch (item.getItem().getItemId()) {
//		case 40318:// TODO 道具物品判斷
//			this.writeH(166);// TODO 似乎是道具物品編號圖示封包判斷
//			break;
//		case 40319:// TODO 道具物品判斷
//			this.writeH(569);// TODO 似乎是道具物品編號圖示封包判斷
//			break;
//		case 40321:// TODO 道具物品判斷
//			this.writeH(837);// TODO 似乎是道具物品編號圖示封包判斷
//			break;
//		case 49158:// TODO 道具物品判斷
//			this.writeH(3674);// TODO 似乎是道具物品編號圖示封包判斷
//			break;
//		case 49157:// TODO 道具物品判斷
//			this.writeH(3605);// TODO 似乎是道具物品編號圖示封包判斷
//			break;
//		case 49156:// TODO 道具物品判斷
//			this.writeH(3606);// TODO 似乎是道具物品編號圖示封包判斷
//			break;
//		default:
//			this.writeH(0);// TODO 3.53C新增封包
//			break;
//		}
//		final int type = Math.max(0, item.getItem().getUseType());
//
//		if (type == 96 || type >= 98) {
//			this.writeC(26);
//		} else if (type == 97) {
//			this.writeC(27);
//		} else {
//			this.writeC(type);// TODO 使用類型
//		}
//		if (item.getChargeCount() > 0) {
//			this.writeC(item.getChargeCount());// TODO 可用次數
//		} else {
//			this.writeC(0x00);// TODO 可用次數
//		}
//		this.writeH(item.get_gfxid());// TODO 圖示
//		this.writeC(item.getBless());// TODO 祝福狀態(是否祝福 0=祝福 1=普通 2=詛咒)
//		this.writeD((int) item.getCount());// TODO 數量
////		int statusX = 0;
////		if (item.isIdentified()) {
////			statusX |= 1;
////
////			if (!item.getItem().isTradable()) {// TODO 是否可交易道具(是否可以交易 0可 1不可)
////				statusX |= 2;
////			}
////			if (!item.getItem().isCantDelete()) {// TODO 是否可刪除道具(是否可刪除 0可 1不可)
////				statusX |= 4;
////			}
////			if (item.getItem().get_safeenchant() < 0
////					|| item.getItem().getUseType() == -3
////					|| item.getItem().getUseType() == -2) {
////				statusX |= 8;
////			}
////			if (item.getBless() >= 128) {// TODO 祝福狀態(是否祝福 0=祝福 1=普通 2=詛咒)
////				statusX = 32;
////				if (item.isIdentified()) {
////					statusX |= 1;
////					statusX |= 2;
////					statusX |= 4;
////					statusX |= 8;
////				} else {
////					statusX |= 2;
////					statusX |= 4;
////					statusX |= 8;
////				}
////			}
////		}
////		this.writeC(statusX);
//		writeC((item.isIdentified()) ? 1 : 0);
//		this.writeS(item.getViewName());// TODO 名稱
//		if (!item.isIdentified()) {
//			// 未鑑定の場合ステータスを送る必要はない
//			this.writeC(0x00);
//		} else {
//			final byte[] status = item.getStatusBytes();
//			this.writeC(status.length);
//			for (final byte b : status) {
//				this.writeC(b);
//			}
//
//		}
//		this.writeC(10);// TODO 3.53C新增封包
//		this.writeD(0);// TODO 3.53C新增封包
//		this.writeD(0);// TODO 3.53C新增封包
//		this.writeH(0);// TODO 3.53C新增封包
	}

	public S_AddItem(final L1ItemInstance item, final int i) {
		this.writeC(S_OPCODE_ADDITEM);
		this.writeD(item.getId());
		switch (item.getItem().getItemId()) {
		case 40318:// TODO 道具物品判斷
			this.writeH(166);// TODO 似乎是道具物品編號圖示封包判斷
			break;
		case 40319:// TODO 道具物品判斷
			this.writeH(569);// TODO 似乎是道具物品編號圖示封包判斷
			break;
		case 40321:// TODO 道具物品判斷
			this.writeH(837);// TODO 似乎是道具物品編號圖示封包判斷
			break;
		case 49158:// TODO 道具物品判斷
			this.writeH(3674);// TODO 似乎是道具物品編號圖示封包判斷
			break;
		case 49157:// TODO 道具物品判斷
			this.writeH(3605);// TODO 似乎是道具物品編號圖示封包判斷
			break;
		case 49156:// TODO 道具物品判斷
			this.writeH(3606);// TODO 似乎是道具物品編號圖示封包判斷
			break;
		default:
			this.writeH(0);// TODO 3.53C新增封包
			break;
		} // TODO 3.53C

		// 3.52C
		// writeC(item.getItem().getUseType());
		// writeC(0);

		// TODO 3.53C start
		final int type = Math.max(0, item.getItem().getUseType());
		// if (type == 96 || type >= 98){ // unknown type (tw only)
		// writeC(26);
		// } else if (type == 97){ // unknown type (tw only)
		// writeC(27);
		// } else {
		this.writeC(type);
		// }
		final int count = Math.max(0, item.getChargeCount());

		this.writeC(count);
		// TODO 3.53C end

		this.writeH(item.get_gfxid());// TODO 圖示
		this.writeC(item.getBless());// TODO 祝福狀態(是否祝福 0=祝福 1=普通 2=詛咒)
		this.writeD((int) item.getCount());
		this.writeC(item.isIdentified() ? 1 : 0);
		this.writeS(item.getViewName());
		if (!item.isIdentified()) {
			// 未鑑定の場合ステータスを送る必要はない
			this.writeC(0);
		} else {
			final byte[] status = item.getStatusBytes();
			this.writeC(status.length);
			for (final byte b : status) {
				this.writeC(b);
			}
		}
		// TODO 3.53C start
		this.writeC(10);
		this.writeD(0);
		this.writeD(0);
		this.writeH(0);
		// TODO 3.53C end
	}

	@Override
	public byte[] getContent() {
		return this._bao.toByteArray();
	}

	@Override
	public String getType() {
		return S_ADD_ITEM;
	}
}
